package com.one.group.admin.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.one.group.admin.mapper.QuestionnaireSurveyMapper;
import com.one.group.model.dto.QuestionnaireSurveyAddDto;
import com.one.group.model.dto.QuestionnaireSurveyQueryDto;
import com.one.group.model.dto.QuestionnaireSurveyUpdateDto;
import com.one.group.model.dto.QuestionnaireKeywordSearchDto;
import com.one.group.model.entity.QuestionnaireSurvey;
import com.one.group.model.vo.QuestionnaireSurveyListVo;
import com.one.group.service.QuestionnaireSurveyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 问卷服务实现类
 * @author kld
 */
@Service
public class QuestionnaireSurveyServiceImpl extends ServiceImpl<QuestionnaireSurveyMapper, QuestionnaireSurvey> implements QuestionnaireSurveyService {
    private static final Logger log = LoggerFactory.getLogger(QuestionnaireSurveyServiceImpl.class);
    
    @Autowired
    private QuestionnaireSurveyMapper questionnaireSurveyMapper;
    
    // 获取租户ID的辅助方法
    private Long getCurrentTenantId() {
        Long tenantId = Convert.toLong(StpUtil.getExtra("tenant_id"));
        log.debug("当前租户ID: {}", tenantId);
        return tenantId;
    }
    
    @Override
    public boolean addQuestionnaire(QuestionnaireSurveyAddDto addDto) {
        Long tenantId = getCurrentTenantId();
        // 创建问卷实体
        QuestionnaireSurvey questionnaire = new QuestionnaireSurvey();
        
        // 设置基本信息
        questionnaire.setCellId(addDto.getCellId());
        questionnaire.setQuestionnaireName(addDto.getQuestionnaireName());
        questionnaire.setQuestionnaireDescription(addDto.getQuestionnaireDescription());
        questionnaire.setParticipationScope(addDto.getParticipationScope());
        questionnaire.setPublishTime(addDto.getPublishTime());
        questionnaire.setEndTime(addDto.getEndTime());
        questionnaire.setAnswerCount(0); // 初始回答数量为0
        
        // 设置状态：根据发布时间和当前时间判断
        Date now = new Date();
        if (addDto.getPublishTime().after(now)) {
            questionnaire.setStatus("未开始");
        } else if (addDto.getEndTime().before(now)) {
            questionnaire.setStatus("已结束");
        } else {
            questionnaire.setStatus("进行中");
        }
        
        questionnaire.setIsDeleted(0);
        questionnaire.setCreateTime(now);
        questionnaire.setTenantId(tenantId); // 使用当前租户ID
        
        // 保存到数据库
        boolean result = save(questionnaire);
        if (result) {
            log.debug("添加问卷成功，问卷ID: {}, 名称: {}", questionnaire.getId(), questionnaire.getQuestionnaireName());
        } else {
            log.debug("添加问卷失败，名称: {}", questionnaire.getQuestionnaireName());
        }
        return result;
    }
    
    @Override
    public List<QuestionnaireSurveyListVo> findQuestionnaireByQueryDto(QuestionnaireSurveyQueryDto queryDto) {
        // 设置租户ID
        queryDto.setTenantId(getCurrentTenantId());
        return questionnaireSurveyMapper.findQuestionnaireByQueryDto(queryDto);
    }
    
    @Override
    public boolean deleteQuestionnaire(Long id) {
        Long tenantId = getCurrentTenantId();
        // 使用条件更新，确保只删除当前租户且存在的问卷
        // 创建更新条件
        QueryWrapper queryWrapper = QueryWrapper.create()
                .eq("id", id)
                .eq("tenant_id", tenantId)
                .eq("is_deleted", 0);
        
        // 设置更新字段
        QuestionnaireSurvey questionnaire = new QuestionnaireSurvey();
        questionnaire.setIsDeleted(1); // 标记为已删除

        // 执行条件更新
        boolean result = update(questionnaire, queryWrapper);
        if (result) {
            log.debug("删除问卷成功，问卷ID: {}, 租户ID: {}", id, tenantId);
        } else {
            log.debug("删除问卷失败，问卷ID: {}, 租户ID: {}", id, tenantId);
        }
        return result;
    }
    

    
    @Override
    public boolean updateQuestionnaire(QuestionnaireSurveyUpdateDto updateDto) {
        Long tenantId = getCurrentTenantId();
        // 设置租户ID
        updateDto.setTenantId(tenantId);
        
        // 验证问卷是否存在且属于当前租户
        QueryWrapper queryWrapper = QueryWrapper.create()
                .eq("id", updateDto.getId())
                .eq("tenant_id", tenantId)
                .eq("is_deleted", 0);
        
        QuestionnaireSurvey existingQuestionnaire = getOne(queryWrapper);
        if (existingQuestionnaire == null) {
            return false; // 问卷不存在或不属于当前租户
        }
        
        // 更新问卷基本信息
        existingQuestionnaire.setCellId(updateDto.getCellId());
        existingQuestionnaire.setQuestionnaireName(updateDto.getQuestionnaireName());
        existingQuestionnaire.setQuestionnaireDescription(updateDto.getQuestionnaireDescription());
        existingQuestionnaire.setParticipationScope(updateDto.getParticipationScope());
        existingQuestionnaire.setPublishTime(updateDto.getPublishTime());
        existingQuestionnaire.setEndTime(updateDto.getEndTime());
        
        // 更新状态：根据发布时间和当前时间判断
        Date now = new Date();
        if (updateDto.getPublishTime().after(now)) {
            existingQuestionnaire.setStatus("未开始");
        } else if (updateDto.getEndTime().before(now)) {
            existingQuestionnaire.setStatus("已结束");
        } else {
            existingQuestionnaire.setStatus("进行中");
        }
        
        // 执行更新
        boolean result = updateById(existingQuestionnaire);
        if (result) {
            log.debug("更新问卷成功，问卷ID: {}, 名称: {}", existingQuestionnaire.getId(), existingQuestionnaire.getQuestionnaireName());
        } else {
            log.debug("更新问卷失败，问卷ID: {}, 名称: {}", existingQuestionnaire.getId(), existingQuestionnaire.getQuestionnaireName());
        }
        return result;
    }
    
    @Override
    public QuestionnaireSurvey getById(Long id) {
        Long tenantId = getCurrentTenantId();
        // 查询问卷详情，只返回当前租户且未删除的问卷
        QueryWrapper queryWrapper = QueryWrapper.create()
                .eq("id", id)
                .eq("tenant_id", tenantId)
                .eq("is_deleted", 0);
        
        return getOne(queryWrapper);
    }
    
    @Override
    public List<QuestionnaireSurveyListVo> findQuestionnaireByKeyword(QuestionnaireKeywordSearchDto keywordSearchDto) {
        // 设置租户ID
        keywordSearchDto.setTenantId(getCurrentTenantId());
        return questionnaireSurveyMapper.findQuestionnaireByKeyword(keywordSearchDto);
    }
}